stylecontext: Don't cache the root values
authorBenjamin Otte <otte@redhat.com>
Sat, 11 Oct 2014 18:02:27 +0000 (20:02 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 15 Oct 2014 15:08:47 +0000 (17:08 +0200)
Those are the ones that are special and get animated. Caching them only
causes confusion.

gtk/gtkstylecontext.c

index e48aedd88aac42a1f6d65a854f80531483ace150..5705ec6b74967954bc4d6d1341f5aff7f6078e53 100644 (file)
@@ -704,6 +704,17 @@ gtk_style_context_impl_get_property (GObject    *object,
     }
 }
 
+/* returns TRUE if someone called gtk_style_context_save() but hasn’t
+ * called gtk_style_context_restore() yet.
+ * In those situations we don’t invalidate the context when somebody
+ * changes state/regions/classes.
+ */
+static gboolean
+gtk_style_context_is_saved (GtkStyleContext *context)
+{
+  return context->priv->info->next != NULL;
+}
+
 static void
 style_info_add_to_widget_path (GtkStyleInfo  *info,
                                GtkWidgetPath *path,
@@ -810,13 +821,17 @@ style_values_lookup (GtkStyleContext *context)
     }
 
   values = _gtk_css_computed_values_new ();
-  style_info_set_values (info, values);
-  g_hash_table_insert (priv->style_values,
-                       style_info_copy (info),
-                       values);
 
+  style_info_set_values (info, values);
+  if (gtk_style_context_is_saved (context))
+    g_hash_table_insert (priv->style_values,
+                         style_info_copy (info),
+                         g_object_ref (values));
+  
   build_properties (context, values, info, NULL);
 
+  g_object_unref (values);
+
   return values;
 }
 
@@ -861,17 +876,6 @@ gtk_style_context_set_invalid (GtkStyleContext *context,
     }
 }
 
-/* returns TRUE if someone called gtk_style_context_save() but hasn’t
- * called gtk_style_context_restore() yet.
- * In those situations we don’t invalidate the context when somebody
- * changes state/regions/classes.
- */
-static gboolean
-gtk_style_context_is_saved (GtkStyleContext *context)
-{
-  return context->priv->info->next != NULL;
-}
-
 static void
 gtk_style_context_queue_invalidate_internal (GtkStyleContext *context,
                                              GtkCssChange     change)
@@ -3080,10 +3084,6 @@ _gtk_style_context_validate (GtkStyleContext  *context,
       if (current)
         {
           changes = _gtk_css_computed_values_get_difference (values, current);
-
-          /* In the case where we keep the cache, we want unanimated values */
-          if (values != current)
-            _gtk_css_computed_values_cancel_animations (current);
         }
       else
         {
@@ -3094,6 +3094,8 @@ _gtk_style_context_validate (GtkStyleContext  *context,
   else
     {
       changes = _gtk_css_computed_values_compute_dependencies (current, parent_changes);
+      if (!_gtk_bitmask_is_empty (changes))
+       build_properties (context, current, info, changes);
 
       gtk_style_context_update_cache (context, parent_changes);
     }